package com.moss.cloud.common.core.utils;

import com.moss.cloud.common.core.exception.BaseException;
import com.moss.cloud.common.core.exception.SystemErrorType;
import com.moss.cloud.common.core.handel.*;

import java.util.function.Supplier;

public class BooleanHandel {
    /**
     * 如果参数为true抛出异常
     *
     * @param b
     * @return com.moss.cloud.common.core.handel.ThrowExceptionFunction
     **/
    public static ThrowExceptionHandel trueThrow(Boolean b) {
        return (errorMessage) -> {
            if (b) {
                throw new BaseException(errorMessage);
            }
        };
    }

    /**
     * 参数为true或false时，分别进行不同的操作
     *
     * @param b
     * @return com.moss.cloud.common.core.handel.BranchHandle
     **/
    public static BranchHandle isTureOrFalse(Boolean b) {
        return (trueHandle, falseHandle) -> {
            if (b) {
                trueHandle.run();
            } else {
                falseHandle.run();
            }
        };
    }

    /**
     * 参数为true时进行操作
     *
     * @param b
     * @return com.moss.cloud.common.core.handel.TrueHandel
     **/
    public static TrueHandel isTrue(Boolean b) {
        return (trueHandle) -> {
            if (b) {
                trueHandle.run();
            }
        };
    }

    /**
     * 参数为true时进行操作并返回数据
     *
     * @param b 条件
     * @return com.moss.cloud.common.core.handel.TrueHandel
     **/
    public static <T> T isTrue(Boolean b, Supplier<T> trueHandle) {
        return Boolean.TRUE.equals(b) ? trueHandle.get() : null;
    }

    /**
     * 如果参数为true抛出异常
     * 主要是用于服务间调用抛出上游服务异常码和异常信息
     *
     * @param b
     * @return com.moss.cloud.common.core.handel.BusinessExceptionHandel
     **/
    public static BusinessExceptionHandel businessThrow(Boolean b) {
        return (codeMesg) -> {
            if (b) {
                throw new BaseException(SystemErrorType.BUSINESS_ERROR, codeMesg);
            }
        };
    }

    /**
     * 分支操作
     *
     * @param condition   条件
     * @param trueHandle  为true时要进行的操作
     * @param falseHandle 为false时要进行的操作
     * @param <T>         返回对象
     * @return <T>
     */
    public <T> T trueOrFalseBack(boolean condition, Supplier<T> trueHandle, Supplier<T> falseHandle) {
        if (condition) {
            return trueHandle.get();
        }else {
            return falseHandle.get();
        }
    }
}
